#include "LFSR.h"

// Pour compiler : gcc -o crypter crypter.c LFSR.c bits.c
// Pour exécuter : ./crypter berlekamp-massey.pdf 10010011101


//--------------------------------------------------MAIN-------------------------------------------------------------

int main(int argc, char** argv)
{
  //Vérification de l'argument
  if (argc != 3)
  {
    printf("Syntaxe : ./crypter nomDuFichierACrypter 11bitsDeP\n");
    return 1;
  }


  //Ouverture du fichier à décrypter
  FILE* fichierClair;
  fichierClair = fopen(argv[1], "rb");

  if (fichierClair == NULL)
  {
    printf("Le programme n'a pas pu ouvrir ce fichier. Vérifiez qu'il existe et que vous avez le droit de le lire.\n");
    return 1;
  }

  printf("Ouverture du fichier %s à l'adresse %p\n", argv[1], fichierClair);


  uint* clair;
  int nbClair = NfileStore(fichierClair, &clair);
  fseek(fichierClair, 0, SEEK_END);
  int longueurFichier = ftell(fichierClair); //La longueur est donnée en octets
  fclose(fichierClair);
  printf("Adresse de clair : %p\n", clair);  

  //Naffiche(clair, nbClair, 32 * nbClair);
  printf("\n");

  int nbBitsP = strlen(argv[2]);
  int nbP = Ntaille(nbBitsP);  
  printf("nbP : %d\n", nbP);
  uint* P = malloc(nbP * sizeof(uint));  
  Nedit(P, nbP, argv[2]);
  printf("P (pointeur) = %p\n", P);
  
  printf("%s\n", argv[2]);
  printf("P     : ");
  Naffiche(P, nbP, 32 * nbP);
  printf("\n");

  int nbS = Ntaille(10);
  uint* S = malloc(nbS);
  Nedit(S, 1, "0001101001");
  printf("S     : ");
  Naffiche(S, nbS, 32 * nbS);
  printf("\n");

  int L = nbBitsP - 1;
  uint* suiteChiffrante = malloc(nbClair * sizeof(uint));  
  suiteChiffrante = LFSR(L, P, S, nbClair * 32);
  printf("clé   : ");
  Naffiche(suiteChiffrante, nbClair, nbClair * 32);
  printf("\n");

  printf("clair : ");
  Naffiche(clair, nbClair, nbClair * 32);
  printf("\n");
  
  uint* crypte = malloc(nbClair * sizeof(uint));
  int i;
  for (i = 0; i < nbClair; i++) crypte[i] = clair[i] ^ suiteChiffrante[i];

  printf("crypt : ");
  Naffiche(crypte, nbClair, 32 * nbClair);
  printf("\n");
  
  
  
  //uint* clair2 = malloc(nbClair * sizeof(uint));
  //for (i = 0; i < nbClair; i++) clair2[i] = crypte[i] ^ suiteChiffrante[i];
  
  

  // On crée un fichier appelé crypte.pdf pour stocker les bits de crypte
  FILE* fichierCrypte;
  fichierCrypte = fopen("./crypte.pdf", "wb");

  if (fichierClair == NULL)
  {
    printf("Le programme n'a pas pu ouvrir ce fichier. Vérifiez qu'il existe et que vous avez le droit de le lire.\n");
    return 1;
  }

  fwrite(crypte, sizeof(uint), nbClair, fichierCrypte);
  fclose(fichierCrypte);

  return 0;

}


